package br.com.toscano.gobra.domain;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;

@Entity 
@Table(name="BOLETIM_MEDICAO")
public class BoletimMedicao extends ObjetoAbstrato {

	private static final long serialVersionUID = 13454543354520L;
	
	public static final String NAO_PAGO  = "0";
	public static final String PAGO_PARCIAL = "1";
	public static final String PAGO_TOTAL = "2";
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="BOME_ID")
	private Long id;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "OBRA_ID")
	private Obra obra;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "ESTA_UF_ENGENHEIRO_EMPRESA")	
	private Estado ufCreaEngenheiroEmpresa;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "ESTA_UF_ENGENHEIRO_PREFEITURA")	
	private Estado ufCreaEngenheiroPrefeitura;

	@Column(name="BOME_NOME_ENGENHEIRO_EMPRESA", nullable=false, length=255)
	private String nomeEngenheiroEmpresa;

	@Column(name="BOME_CPF_ENGENHEIRO_EMPRESA", nullable=false, length=255)
	private String cpfEngenheiroEmpresa;

	@Column(name="BOME_CREA_ENGENHEIRO_EMPRESA", nullable=false, length=255)
	private String creaEngenheiroEmpresa;
	
	@Column(name="BOME_NOME_ENGENHEIRO_PREFEITURA", nullable=false, length=255)
	private String nomeEngenheiroPrefeitura;

	@Column(name="BOME_CPF_ENGENHEIRO_PREFEITURA", nullable=false, length=255)
	private String cpfEngenheiroPrefeitura;

	@Column(name="BOME_CREA_ENGENHEIRO_PREFEITURA", nullable=false, length=255)
	private String creaEngenheiroPrefeitura;

	@Column(name="BOME_NUM_MEDICAO", nullable=false, length=255)
	private String numeroMedicao;
	
	@Column(name="BOME_STATUS_PAGAMENTO", nullable=false, length=255)
	private String statusPagamento;

	@Temporal(TemporalType.DATE)
	@Column(name = "BOME_DATA_BOLETIM", length = 7, nullable = false)
	private Date dataBoleim;

	@Temporal(TemporalType.DATE)
	@Column(name = "BOME_DATA_MEDICAO", length = 7, nullable = false)
	private Date dataInicioMedicao;
	
	@Column(name = "BOME_VALOR_MEDICAO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorMedicao;
	
	@Column(name = "BOME_SALDO_ANTERIOR", nullable = false, precision = 19, scale = 2)
	private BigDecimal saldoAnterior;
	
	@Column(name = "BOME_SALDO_ATUAL", nullable = false, precision = 19, scale = 2)
	private BigDecimal saldoAtual;
	
	@Column(name = "BOME_SALDO_RESTANTE", nullable = false, precision = 19, scale = 2)
	private BigDecimal saldoRestante;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "boletimMedicao", orphanRemoval = true)
	@Cascade(value={org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.MERGE})
	private List<ItemBoletimMedicao> listaItensFichaObra = new ArrayList<ItemBoletimMedicao>();
	
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name="PAGAMENTO_BOLETIM_MEDICAO",
	    joinColumns = @JoinColumn( name="BOME_ID"),
	    inverseJoinColumns = @JoinColumn( name="PAGA_ID"))
	private List<Pagamento> listaPagamentoObra = new ArrayList<Pagamento>();

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Obra getObra() {
		return obra;
	}

	public void setObra(Obra obra) {
		this.obra = obra;
	}

	public Estado getUfCreaEngenheiroEmpresa() {
		return ufCreaEngenheiroEmpresa;
	}

	public void setUfCreaEngenheiroEmpresa(Estado ufCreaEngenheiroEmpresa) {
		this.ufCreaEngenheiroEmpresa = ufCreaEngenheiroEmpresa;
	}

	public Estado getUfCreaEngenheiroPrefeitura() {
		return ufCreaEngenheiroPrefeitura;
	}

	public void setUfCreaEngenheiroPrefeitura(Estado ufCreaEngenheiroPrefeitura) {
		this.ufCreaEngenheiroPrefeitura = ufCreaEngenheiroPrefeitura;
	}

	public String getNomeEngenheiroEmpresa() {
		return nomeEngenheiroEmpresa;
	}

	public void setNomeEngenheiroEmpresa(String nomeEngenheiroEmpresa) {
		this.nomeEngenheiroEmpresa = nomeEngenheiroEmpresa;
	}

	public String getCpfEngenheiroEmpresa() {
		return cpfEngenheiroEmpresa;
	}

	public void setCpfEngenheiroEmpresa(String cpfEngenheiroEmpresa) {
		this.cpfEngenheiroEmpresa = cpfEngenheiroEmpresa;
	}

	public String getCreaEngenheiroEmpresa() {
		return creaEngenheiroEmpresa;
	}

	public void setCreaEngenheiroEmpresa(String creaEngenheiroEmpresa) {
		this.creaEngenheiroEmpresa = creaEngenheiroEmpresa;
	}

	public String getNomeEngenheiroPrefeitura() {
		return nomeEngenheiroPrefeitura;
	}

	public void setNomeEngenheiroPrefeitura(String nomeEngenheiroPrefeitura) {
		this.nomeEngenheiroPrefeitura = nomeEngenheiroPrefeitura;
	}

	public String getCpfEngenheiroPrefeitura() {
		return cpfEngenheiroPrefeitura;
	}

	public void setCpfEngenheiroPrefeitura(String cpfEngenheiroPrefeitura) {
		this.cpfEngenheiroPrefeitura = cpfEngenheiroPrefeitura;
	}

	public String getCreaEngenheiroPrefeitura() {
		return creaEngenheiroPrefeitura;
	}

	public void setCreaEngenheiroPrefeitura(String creaEngenheiroPrefeitura) {
		this.creaEngenheiroPrefeitura = creaEngenheiroPrefeitura;
	}

	public String getNumeroMedicao() {
		return numeroMedicao;
	}

	public void setNumeroMedicao(String numeroMedicao) {
		this.numeroMedicao = numeroMedicao;
	}

	public String getStatusPagamento() {
		return statusPagamento;
	}

	public void setStatusPagamento(String statusPagamento) {
		this.statusPagamento = statusPagamento;
	}

	public Date getDataBoleim() {
		return dataBoleim;
	}

	public void setDataBoleim(Date dataBoleim) {
		this.dataBoleim = dataBoleim;
	}

	public Date getDataInicioMedicao() {
		return dataInicioMedicao;
	}

	public void setDataInicioMedicao(Date dataInicioMedicao) {
		this.dataInicioMedicao = dataInicioMedicao;
	}

	public BigDecimal getValorMedicao() {
		return valorMedicao;
	}

	public void setValorMedicao(BigDecimal valorMedido) {
		this.valorMedicao = valorMedido;
	}

	public BigDecimal getSaldoAnterior() {
		return saldoAnterior;
	}

	public void setSaldoAnterior(BigDecimal saldoAnterior) {
		this.saldoAnterior = saldoAnterior;
	}

	public BigDecimal getSaldoAtual() {
		return saldoAtual;
	}

	public void setSaldoAtual(BigDecimal saldoAtual) {
		this.saldoAtual = saldoAtual;
	}

	public BigDecimal getSaldoRestante() {
		return saldoRestante;
	}

	public void setSaldoRestante(BigDecimal saldoRestante) {
		this.saldoRestante = saldoRestante;
	}

	public List<ItemBoletimMedicao> getListaItensFichaObra() {
		return listaItensFichaObra;
	}

	public void setListaItensFichaObra(List<ItemBoletimMedicao> listaItensFichaObra) {
		this.listaItensFichaObra = listaItensFichaObra;
	}

	public List<Pagamento> getListaPagamentoObra() {
		return listaPagamentoObra;
	}

	public void setListaPagamentoObra(List<Pagamento> listaPagamentoObra) {
		this.listaPagamentoObra = listaPagamentoObra;
	}
	
	
	
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if(!this.getClass().equals(obj.getClass()))
			return false;
		if (getClass() != obj.getClass())
			return false;
		BoletimMedicao other = (BoletimMedicao) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	
	
}